草庐IT

Codeforces1695 D1.+D2 Tree Queries

全部标签

【CodeForces】Educational Codeforces Round 132 (Rated for Div. 2)

比赛链接链接A.ThreeDoors题目链接链接题目描述输入输出样例输入43012103223102130输出YESNOYESNO题目大意面前有三个门,编号分别为1,2,3。再给你一把编号为x的钥匙,打开每扇门后,可以有一把编号为a[i]的钥匙,判断所给的x是否能把三扇门都打开。思路按照题意进行模拟,并且用a[]存放钥匙编号,st[]用来判断门是否打开代码#include#include#include#include#includeusingnamespacestd;voidsolve(){ intx; cin>>x; inta[4]; cin>>a[1]>>a[2]>>a[3]; bo

Codeforces 1646 D. Weight the Tree

题意给你n个节点的树,让你给每个节点进行赋值,并且赋的值需要为正整数;同时当一个节点的值等于所有邻居节点的值的和时,这个点为好点;求出一组赋值情况,满足树的好点个数最大化的同时,所有节点赋值的总和最小;思路1.显然无法存在两个好点相邻存在的情况(除非只有两个节点);2.对于坏点直接赋值为1即可;3.可以树形dp解决,f[x][0/1][0/1],第一维代表以x为根,第二维代表是否为好点,第三维代表是好点的个数/子树节点值的总和代码#includeusingnamespacestd;vectorg[200005];intf[200005][2][2];longlongans[200005];in

Codeforces 1646 D. Weight the Tree

题意给你n个节点的树,让你给每个节点进行赋值,并且赋的值需要为正整数;同时当一个节点的值等于所有邻居节点的值的和时,这个点为好点;求出一组赋值情况,满足树的好点个数最大化的同时,所有节点赋值的总和最小;思路1.显然无法存在两个好点相邻存在的情况(除非只有两个节点);2.对于坏点直接赋值为1即可;3.可以树形dp解决,f[x][0/1][0/1],第一维代表以x为根,第二维代表是否为好点,第三维代表是好点的个数/子树节点值的总和代码#includeusingnamespacestd;vectorg[200005];intf[200005][2][2];longlongans[200005];in

【CodeForces -527C】Glass Carving(无旋treap-平衡树)

题目传送门:https://codeforces.com/problemset/problem/527/C题意:给出一个面积为h×w的长方形,有m次操作,每次操作可以横着或竖着在某个位置砍一刀,问你在m次操作后,在所有块中面积最大的一个。思路:理解题意,就是让你求砍m次后,剩下的部分的最长的高和最长的宽,相乘就是最大面积,所以我们可以利用平衡树中的前驱和后继来求所切割点所在部分的长度,同时利用两颗平衡树来维护高和宽,再利用multiset来维护切割后的高度和宽度,每次切割时,要先在multiset中找到所要切割线段的长度,将其切割后再放回去,最后从multiset中找到最长的高和宽相乘即是所求

【CodeForces -527C】Glass Carving(无旋treap-平衡树)

题目传送门:https://codeforces.com/problemset/problem/527/C题意:给出一个面积为h×w的长方形,有m次操作,每次操作可以横着或竖着在某个位置砍一刀,问你在m次操作后,在所有块中面积最大的一个。思路:理解题意,就是让你求砍m次后,剩下的部分的最长的高和最长的宽,相乘就是最大面积,所以我们可以利用平衡树中的前驱和后继来求所切割点所在部分的长度,同时利用两颗平衡树来维护高和宽,再利用multiset来维护切割后的高度和宽度,每次切割时,要先在multiset中找到所要切割线段的长度,将其切割后再放回去,最后从multiset中找到最长的高和宽相乘即是所求

Codeforces Round #838 (Div. 2) D. GCD Queries

题意有个长度为n的排列p,[0,1,2,...n-1],你可以进行至多2*n次询问,每次询问两个i,j,返回gcd(pi,pj),让你在规定时间内猜出0在哪两个位置之一思路这是一道交互题,询问的上限是2n次通过三个数,可以去除掉一个不是0的数对三个数进行以下询问,gcd(a,i),gcd(b,i)如果gcd(a,i)!=gcd(b,i),那么其中a,b小的被i取代,因为a,b中假如有0,那么一定是大的数,那么小的数一定不是0如果gcd(a,i)==gcd(b,i),那么跳过i,因为假如i是0,因为数列每个数都不同,所必不可能相等那么for一遍数组,每次和当前位置i进行两次询问,最多2n的限制内

Codeforces Round #838 (Div. 2) D. GCD Queries

题意有个长度为n的排列p,[0,1,2,...n-1],你可以进行至多2*n次询问,每次询问两个i,j,返回gcd(pi,pj),让你在规定时间内猜出0在哪两个位置之一思路这是一道交互题,询问的上限是2n次通过三个数,可以去除掉一个不是0的数对三个数进行以下询问,gcd(a,i),gcd(b,i)如果gcd(a,i)!=gcd(b,i),那么其中a,b小的被i取代,因为a,b中假如有0,那么一定是大的数,那么小的数一定不是0如果gcd(a,i)==gcd(b,i),那么跳过i,因为假如i是0,因为数列每个数都不同,所必不可能相等那么for一遍数组,每次和当前位置i进行两次询问,最多2n的限制内

「codeforces - 1394C」Boboniu and String

link。注意到BN-string长成什么样根本不重要,我们把它表述为BN-pair\((x,y)\)即可,两个BN-strings相似的充要条件即两者分别映射得到的BN-pairs相等。将BN-pairs放到平面上来研究,题目中给出的变换就对应\((x,y)\rightarrow(x\pm1,y),(x,y\pm1),(x\pm1,y\pm1)\),注意到在斜线方向上的移动只能同时加或减。我们可以用这样移动方式的所派生的\(\text{dist}(a,b)\)函数导出在平面上的「圆」(是一般意义下的hexagon),如下图二分「半径」\(r\)我们现在的问题就转化为了,判定原图上所有点以\(

「codeforces - 1394C」Boboniu and String

link。注意到BN-string长成什么样根本不重要,我们把它表述为BN-pair\((x,y)\)即可,两个BN-strings相似的充要条件即两者分别映射得到的BN-pairs相等。将BN-pairs放到平面上来研究,题目中给出的变换就对应\((x,y)\rightarrow(x\pm1,y),(x,y\pm1),(x\pm1,y\pm1)\),注意到在斜线方向上的移动只能同时加或减。我们可以用这样移动方式的所派生的\(\text{dist}(a,b)\)函数导出在平面上的「圆」(是一般意义下的hexagon),如下图二分「半径」\(r\)我们现在的问题就转化为了,判定原图上所有点以\(

Codeforces Round #845 (Div. 2) and ByteRace 2023 C-E

碎碎念这次a和b过的可能是有生以来最快的(?)然后写C写了一个多小时还没写出来(悲)最后剩不到二十分钟看了眼D,结果瞬间悟出了答案(属于是开题失误了)最后以最快速度写完,一抬头发现刚好时间到了(樂)属于是到手的紫名飞了呜呜C题题意思路比赛时没有注意到的一个重要性质是答案只与最大值和最小值相关,这是十分不应该的。注意到这一点后对所有smartness排序就成为了很自然的想法。接下来就是考虑对于左端点为l时维护当右端点r取到哪里时能凑出的topic的数目为m了,这可以利用双指针线性求出。D题题意大概就是说有个树,每个节点都可能是1或者是0,每过一秒所有节点的值都会变成它们儿子异或起来的值,叶子则会